import axios from 'axios'
import { Notification, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
import Config from '@/settings'
import QS from 'qs'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url
  timeout: Config.timeout // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    // config.headers['Content-Type'] = 'application/json'
    return config
  },
  error => {
    // Do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    const code = response.status

    if (code < 200 || code > 300) {
      Notification.error({
        title: response.message
      })
      return Promise.reject('error')
    } else {
      const res = response.data

      if (res instanceof Blob) {
        return res
      }

      if (res.code === 0) {
        return res.data
      }

      // 2402 验证失效
      if (res.code === 2402) {
        MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
          store.dispatch('LogOut').then(() => {
            location.reload()
          })
        })
      } else {
        Notification.error({
          title: res.msg,
          duration: 5000
        })
      }
      return Promise.reject(new Error(res.msg || 'Error'))
    }
  },
  error => {
    Notification.error({
      title: '接口请求失败',
      duration: 5000
    })
    return Promise.reject(error)
  }
)

export function postForm(url, data) {
  return service.post(url, QS.stringify(data))
}

export function get(url, params) {
  return service.get(url, { params: params })
}

export function filePost(url) {
  return service.post(url, {}, { responseType: 'blob' })
}

export async function getSync(url, params) {
  var result = await service.get(url, { params: params })
  return result
}

export function put(url, data) {
  return service.put(url, QS.stringify(data))
}

export default service
